package com.gupao.ldr.pattern.singleton.seriable;

import java.io.*;

/**
 * 序列化,线程安全问题
 * 反序列化时导致单例破坏
 *
 * 序列化就是说把内存中的状态通过转换成字节码的形式，
 * 从而转换一个IO流，写入到其他地方（可以是磁盘，网络IO）
 * 内存中状态给永久保存下来
 *
 * 反序列化：已经持久化到字节码内容，转换为IO流
 * 通过IO流的读取，进而将读取的内容转换为Java对象
 * 在转换过程中会重新创建对象new
 */
public class Seriable implements Serializable {

    public final static Seriable INSTANCE = new Seriable();

    private Seriable() {

    }

    public static Seriable getInstance() {
        return INSTANCE;
    }

    //重写方法，使得对象地址是一样的
    //序列化和反序列化，造成对象地址不同，所以要重写Serializable方法
    private Object readResolve(){
        return INSTANCE;
    }

    public static void main(String[] args) {
        Seriable s1 = null;
        Seriable s2 = Seriable.getInstance();
        try {


            FileOutputStream fos = new FileOutputStream("Seriable.obj");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(s2);
            oos.flush();
            oos.close();

            FileInputStream fis=new FileInputStream("Seriable.obj");
            ObjectInputStream ois=new ObjectInputStream(fis);
            s1= (Seriable) ois.readObject();
            ois.close();

            System.out.println(s1==s2);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
